package adke.managers;

import java.awt.Color;
import java.util.Vector;

// beheer kleuren die spelers kunnen kiezen, of al gekozen zijn
// deze moet alle kleuren bijhouden die gegeven worden en het liefst
// kleuren genereren die zoveel mogelijk contrasteren met kleuren die al zijn uitgegeven

public class ColorManager
{
    // houd bij welke kleuren al zijn uitgegeven
    // we willen geen dubbele kleuren, of kleuren die teveel op 
    // elkaar lijken
    private static Vector<Color> takenColors; // todo: maak 'Set' vector van waar alles maar één keer in mag zitten
    
    // kleuren om als eerst uit te kiezen
    private static Color[] primaries = new Color[]
    {
        Color.BLUE, Color.RED, Color.GREEN, Color.MAGENTA, Color.ORANGE, Color.PINK,
        Color.CYAN, Color.WHITE, Color.YELLOW
    };
    
    public ColorManager()
    {
        takenColors = new Vector();
    }
    
    // lever de oude kleur in, zodat we weten dat die weer 
    // beschikbaar is
    // als dit de eerste keer is kan oldColor null zijn
    public static Color getNewColorSuggestion(Color oldColor)
    {
        // hier moet een algoritme komen die een kleur kiest 
        // die het meest wegligt van kleuren die al zijn uitgegeven
        for (Color c : primaries)
        {
            if (validateColor(c))
            {
                takeColor(c);
                return c;
            }
        }
        
        // als alle standaardkleuren al zijn uitgegeven
        int r = randomRGB();
        int g = randomRGB();
        int b = randomRGB();
        
        // genereer ranodm kleuren, en valideer ze
        // de eerste die als OK uit de bus komt nemen we
        Color newColor = null;
        while (!validateColor(newColor))
        {
            newColor = new Color(r, g, b);
        }
        
        // reserveer
        takeColor(newColor);
        
        return newColor;
    }
    
    // methode om te kijken of de kleur met genoeg contrasteert met andere kleuren
    // true = OK
    private static boolean validateColor(Color c)
    {
        // TODO: zorg dat zwart en grijstinten er niet doorkomen
        if (c == null || c.equals(Color.BLACK) || c.equals(Color.GRAY)) return false; // grijs mag niet want de rand is grijs
        
        return !takenColors.contains(c) && c != null; // is true als hij nog niet genomen is en niet null is
    }
    
    private static void takeColor(Color c)
    {
        takenColors.add(c);
    }
    
    public static void returnColor(Color c)
    {
        if (c == null) return;
        
        takenColors.remove(c);
    }
    
    private static int randomRGB()
    {
        return (int)(Math.random() * 255);
    }
}
